Walmart
En el presente proyecto, se realizó un modelo para categorizar las visitas que realizan los clientes a Walmart basándose únicamente en los productos que compran los clientes en su visita. La base se obtuvo de kaggle de la competencia titulada “Walmart Recruiting: Trip Type Classification”.
Las categorías están representadas por números enteros no contiguos, y no se conoce el significado de ninguna categoría.
La función que se busca optimizar, más específicamente minimizar, es la pérdida logarítmica multiclase también conocida como log loss multiclase, misma que se define como:
\(-\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{M}y_{ij}log(p_{ij})\)
donde \(N\) es el total de visitas en el conjunto de prueba, \(M\) es el total de categorías existentes (como más adelante se verá \(M = 38\)), \(y_{ij}\) es 1 si la observación \(i\) pertenece a la categoría \(j\) y 0 en otro caso, \(p_{ij}\) es la probabilidad obtenida por el modelo que la observación \(i\) pertenezca a la categoría \(j\).
Obtener un valor de la función log loss menor a 1 sobre el conjunto de prueba.
Se realiza la lectura y limpieza de datos con las funciones utils, load, prepare y clean:
source("utils.R")
source("00-load.R")
## [1] "walmart.rds se bajó y guardó\n"
source("01-prepare.R")
source("02-clean.R")
La base de datos original muestra un registro por cada producto que se compró en las diferentes visitas de los clientes en la tienda. Por ejemplo, si un cliente en su visita compró 10 productos diferentes, esa visita tiene 10 registros con el mismo identificador de visita y mismo tipo de visita. Los primeros renglones de la base son los siguientes:
## TripType VisitNumber Weekday Upc ScanCount DepartmentDescription
## 1 999 5 Friday 68113152929 -1 FINANCIAL SERVICES
## 2 30 7 Friday 60538815980 1 SHOES
## 3 30 7 Friday 7410811099 1 PERSONAL CARE
## 4 26 8 Friday 2238403510 2 PAINT AND ACCESSORIES
## 5 26 8 Friday 2006613744 2 PAINT AND ACCESSORIES
## 6 26 8 Friday 2006618783 2 PAINT AND ACCESSORIES
## FinelineNumber
## 1 1000
## 2 8931
## 3 4504
## 4 3565
## 5 1017
## 6 1017
Las variables con las que se cuenta en la base de datos son:
La estructura original de la base no tiene registros únicos a nivel visita, esto complica el ajuste del modelo pues las categorías son a nivel visita. Si se trabajara con la base original, se estaría ajustando una categoría a nivel producto en lugar de a nivel visita. Por lo tanto, el tratamiento que se realizó a los datos consistió en construir la base de forma que tenga un solo renglón por visita. La variable de día de la semana es a nivel visita, por lo que no sufrió modificaciones. Respecto a las variables del departamento y número de productos, se crearon tantas columnas como departamentos existen, 68 en total, y se sumaron de acuerdo al número de productos por departamento comprados por visita. La base creada y utilizada para modelar luce como sigue:
## # A tibble: 10 x 71
## # Groups: TripType, VisitNumber, Weekday [10]
## TripType VisitNumber Weekday HR_PHOTO ACCESSORIES AUTOMOTIVE BAKERY
## <int> <int> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 3 106 Friday 0 0 0 0
## 2 3 121 Friday 0 0 0 0
## 3 3 153 Friday 0 0 0 0
## 4 3 162 Friday 0 0 0 0
## 5 3 164 Friday 0 0 0 0
## 6 3 177 Friday 0 0 0 0
## 7 3 181 Friday 0 0 0 0
## 8 3 188 Friday 0 0 0 0
## 9 3 203 Friday 0 0 0 0
## 10 3 265 Friday 0 0 0 0
## # ... with 64 more variables: BATH_AND_SHOWER <dbl>, BEAUTY <dbl>,
## # BEDDING <dbl>, BOOKS_AND_MAGAZINES <dbl>, BOYS_WEAR <dbl>,
## # BRAS__SHAPEWEAR <dbl>, CAMERAS_AND_SUPPLIES <dbl>,
## # CANDY_TOBACCO_COOKIES <dbl>, CELEBRATION <dbl>, COMM_BREAD <dbl>,
## # CONCEPT_STORES <dbl>, COOK_AND_DINE <dbl>, DAIRY <dbl>,
## # DSD_GROCERY <dbl>, ELECTRONICS <dbl>, FABRICS_AND_CRAFTS <dbl>,
## # FINANCIAL_SERVICES <dbl>, FROZEN_FOODS <dbl>, FURNITURE <dbl>,
## # GIRLS_WEAR_46X__AND_74 <dbl>, GROCERY_DRY_GOODS <dbl>, HARDWARE <dbl>,
## # HEALTH_AND_BEAUTY_AIDS <dbl>, HOME_DECOR <dbl>, HOME_MANAGEMENT <dbl>,
## # HORTICULTURE_AND_ACCESS <dbl>, HOUSEHOLD_CHEMICALS_SUPP <dbl>,
## # HOUSEHOLD_PAPER_GOODS <dbl>, IMPULSE_MERCHANDISE <dbl>,
## # INFANT_APPAREL <dbl>, INFANT_CONSUMABLE_HARDLINES <dbl>,
## # JEWELRY_AND_SUNGLASSES <dbl>, LADIES_SOCKS <dbl>, LADIESWEAR <dbl>,
## # LARGE_HOUSEHOLD_GOODS <dbl>, LAWN_AND_GARDEN <dbl>,
## # LIQUORWINEBEER <dbl>, MEAT__FRESH__FROZEN <dbl>,
## # MEDIA_AND_GAMING <dbl>, MENSWEAR <dbl>, `NULL` <dbl>,
## # OFFICE_SUPPLIES <dbl>, OPTICAL__FRAMES <dbl>, OPTICAL__LENSES <dbl>,
## # OTHER_DEPARTMENTS <dbl>, PAINT_AND_ACCESSORIES <dbl>,
## # PERSONAL_CARE <dbl>, PETS_AND_SUPPLIES <dbl>, PHARMACY_OTC <dbl>,
## # PHARMACY_RX <dbl>, PLAYERS_AND_ELECTRONICS <dbl>,
## # PLUS_AND_MATERNITY <dbl>, PRE_PACKED_DELI <dbl>, PRODUCE <dbl>,
## # SEAFOOD <dbl>, SEASONAL <dbl>, SERVICE_DELI <dbl>,
## # SHEER_HOSIERY <dbl>, SHOES <dbl>, SLEEPWEAR_FOUNDATIONS <dbl>,
## # SPORTING_GOODS <dbl>, SWIMWEAR_OUTERWEAR <dbl>, TOYS <dbl>,
## # WIRELESS <dbl>
En cuanto a la limpieza, ésta consistió en unificar dos departamentos MENS WEAR con MENSWEAR; para todas las variables de departamento se cambiaron los NA’s por 0, pues en realidad los valores nulos de esas variables son porque se realizaron cero compras de ese departamento en la respectiva visita. En los nombres de las variables, se sustituyeron los espacios por guiones bajos y se eliminaron caracteres especiales (las comas y los &) para facilitar en manejo de la base en el análisis exploratorio.
De esta manera, se obtiene una base de datos con 95’674 registros (únicos a nivel visita) y 69 variables explicativas.
En primer lugar, se analiza la variable objetivo: el tipo de visita realizada en Walmart. Su distribución luce como se muestra en la siguiente gráfica:
Se observa que existen categorías que sobresalen respecto a las demás, estas categorías son: 8, 9, 39, 40 y 999. Por el contrario, existen categorías que tienen muy poca presencia en los datos, por ejemplo la 12, 14 y 23, estas categorías con poca representación en los datos muy probablemente serán complicadas de modelar. Para tener mayor detalle se obtienen las frecuencias por categoría:
## 3 4 5 6 7 8 9 12 14 15 18 19
## 3643 346 4593 1277 5752 12161 9464 269 4 978 549 375
## 20 21 22 23 24 25 26 27 28 29 30 31
## 637 641 928 139 2609 3698 503 785 492 433 1081 594
## 32 33 34 35 36 37 38 39 40 41 42 43
## 1984 1315 719 2030 3005 2788 2912 9896 6130 583 1858 872
## 44 999
## 1187 8444
Se realiza ahora el análisis univariado sobre las variables explicativas.
El día de la semana tiene la siguiente distribución:
Notoriamente, la mayoría de las visitas se realizan entre el viernes y el domingo, principalmente el fin de semana. Resulta curioso que el día de la semana con menos visitas es el jueves.
Las visitas realizadas cada día de la semana son las siguientes:
## Monday Tuesday Wednesday Thursday Friday Saturday Sunday
## 12027 11530 11612 11243 15234 16904 17124
El departmento al cual pertenecen los productos comprados y devueltos tiene la siguiente distribución:
Como era de esperarse, existen departamentos con mucha población y departamentos con escasa población.
Es importante recordar que la estructura de la base transformada tiene una columna por cada departamento, por lo tanto la distribución real de cada variable de departamento tiene distribuciones muy concentradas en el cero, por ejemplo:
Incluso en el departamento más pobaldo GROCERY DRY GOODS, la distribución está bastante concentrada en el cero:
Agregar todas las gráficas como anexo
Resulta complicado visualizar las gráficas de la variable objetivo con las variables explicativas, pues el tipo de visita puede tomar 38 valores diferentes. Por ello, se realizarán gráficas separadas, mostrando de 10 en 10 las categorías.
La distribución del día de la semana en que se realiza la visita, para cada categoría se muestra a continuación:
Teniendo en mente la gráfica univariada del día de la semana que se mostró en la sección anterior, y contrastando con la distribución de esta variable para cada categoría, se pueden sacar patrones de cada uno de los tipos de visita. Mencionaremos algunos de ellos:
En la categoría 3, la distribución del día de la semana es bastante diferente a la global, pues tienen un nivel bajo el lunes, comienza a subir, disimuye el jueves y llega a su máximo en viernes, descendiendo el fin de semana.
En la categoría 25, las visitas a Walmart tienen su menor número en lunes, y van a aumentando día a día llegando a su máximo el domingo.
Para la categoría 40, el patrón es igual al global, pero las diferencias del nivel en los diferentes días es más acentuada que en la distribución global.
Es importante mencionar, que todos los tipos de vísita tienen su máximo entre el viernes y el domingo.
Respecto a la variable objetivo y los distintos departamentos, nuevamente se separa en 4 gráficas y se acotó el rango del eje x de -1 a 10 para facilitar su entendimiento e interpretación.
La gráfica bivariada de la variable objetivo y el departamento con mayores compras GROCERY DRY GOODS se muestra a continuación:
Se observa que en la mayoría de las categorías, el departamento GROCERY DRY GOODS está concenctrado en el cero, pero existen categorías con distribuciones que muestran concentraciones en valores positivos. Por ejemplo 12, 15, 44 y más notoriamente en las categorías 37, 38, 39 y 40. Se puede pensar que estas categorías pueden referirse a visitas a Walmart orientadas a compras de este tipo de productos.
Ahora se analiza la distribución del departamento DSD GROCERY para cada tipo de categoría:
Este departamento resulta ser más interesante, pues tiene muchas menos categorías concentradas en el cero. Por ejemplo, la categoría 35 parece tener muy poca población en el cero a diferencia del departamento que se mostró anteriormente.
Ahora se realiza el análisis sobre un departamento menos poblado que los anteriores, éste es PHARMACY OTC:
En este departamento, llaman mucho la atención las categorías 4 y 5 pues son las que tienen una distribución más alejada del cero. Esto lleva a pensar que estas categorías están ligadas con la compra de productos farmacéuticos.
El análisis se vuelve más complicado cuando los departamentos están poco poblados, por ejemplo en JEWELRY AND SUNGLASSES, las gráficas son las siguientes:
En este departamento se redujo más el rango del eje x, de -1 a 5 para tener mejor visualización. La distribución de joyería y lentes de sol tiene una altísima concentración en el cero para prácticamente todas las categorías.
Gráficas
Finalmente, se guardan los datos como un archivo feather para poder realizar el ajuste de modelos en Python.
path <- "Datos/walmart.feather"
write_feather(walmartSpread, path)